package com.xufx.thread.liaoxuefeng.thread11_ReadWriteLock;

import java.util.Arrays;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
 * Created by xufx on 2022/1/4 23:26
 * ReentrantLock保证了只有一个线程可以执行临界区的代码
 * 有些时候，我们的锁并不需要非常的严格。实际场景中，有这样的一个需求：
 *      只允许一个线程写入，当有写入的时候，不许其他线程写入也不允许其他线程读取
 *      么有写入时，允许其他线程写入，也允许其他线程读取
 * 可以使用ReadWriteLock实现上面的需求
 * 读写锁的使用场景是有大量的读和少量的写的情况
 *
 * ReadWriteLock的潜在问题：
 * 1. 如果有线程正在读，那么写的线程要等到拿到锁之后才能执行。也就是说读的过程中不允许写，这是一种悲观锁
 */
public class Main {
}

class Counter{
    private final ReadWriteLock rwLock = new ReentrantReadWriteLock();
    private final Lock rlock = rwLock.readLock();
    private final Lock wlock = rwLock.writeLock();
    private int[] counts = new int[10];

    public void inc(int index){
        wlock.lock();
        try {
            counts[index] += 1;
        }finally {
            wlock.unlock();
        }
    }

    public int[] get(){
        rlock.lock();
        try {
            return Arrays.copyOf(counts, counts.length);
        }finally {
            rlock.unlock();
        }
    }
}


